package com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.controles;

import java.util.Calendar;
import java.util.HashMap;
import java.util.List;

import org.apache.log4j.Logger;

import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.modelo.opciones.Habilitacion;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.modelo.opciones.ParametrosRespuesta;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.modelo.seguridad.OlderPasswords;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.modelo.seguridad.TokenPasswordUsuario;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.modelo.seguridad.Usuario;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.util.UtilRandom;
import com.palominocia.capa_datos_nodoCentral.dbPostgreSQL.schema1.util.Utiles;

public class ControlNodoPublico {
	private static ControlNodoPublico instancia;
	private static Logger logger = Logger.getLogger(ControlNodoPublico.class);
	private ParametrosRespuesta param;
	public static synchronized ControlNodoPublico getInstance() {
		if (instancia == null) {
			instancia = new ControlNodoPublico();
		}
		return instancia;
	}

	public HashMap<String, Object> registraUsuario(String username,
			String password,String Email) {
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();	
		logger.info("Inicio registraUsuario");
		Usuario user = new Usuario();
		OlderPasswords password_user = new OlderPasswords();
		try {
			
			user.setUsername(username);
			user.setPassword(password);
			user.setHabilitado("S");
			user.setEmail(Email);
			user.persist();

			Calendar cal =Calendar.getInstance();
			
			password_user.setUsuarioPassword(user);
			password_user.setFechaActu(cal.getTime());
			password_user.setNewPassword(password);
			password_user.setOlderpassword("");
			password_user.persist();
			param =Utiles.CalculaParametro(0);
			msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
			msgRespuesta.put("mensaje", param.getNombreParametroRespuesta());
			logger.info("Fin registraUsuario");
		} catch (Exception e) {
			logger.error("Error registraUsuario ",e);
			password_user.remove();
			user.remove();
			param =Utiles.CalculaParametro(999999);
			msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
			msgRespuesta.put("mensaje",param.getNombreParametroRespuesta()+ e.getMessage());
			
		}
		
		return msgRespuesta;
	}

	public HashMap<String, Object> solicitaresetPassword(String username,
			String email) {
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();
		logger.info("Inicio solicitaresetPassword");
		try {
			Usuario user = Usuario.findNombreUsuario(username);
			if(user instanceof Usuario){
				if (user.getEmail().equals(email)){
					//Generar token
					//Registrar Token
					Calendar cal =Calendar.getInstance();
					Calendar cal1 =(Calendar) cal.clone();
					cal1.add(Calendar.DATE, UtilRandom.diasMaximoToken());
					TokenPasswordUsuario tk = new TokenPasswordUsuario();
					tk.setCodigoToken(UtilRandom.generarTokenPassword());
					tk.setEstadoToken(Habilitacion.HABILITADO);
					tk.setFechaGeneracion(cal.getTime());
					tk.setFechaExpiracion(cal1.getTime());
					tk.setUsuarioToken(user);
					tk.persist();
					//Enviar token
					param =Utiles.CalculaParametro(0);
					msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
					msgRespuesta.put("mensaje", param.getNombreParametroRespuesta());
					msgRespuesta.put("tokenRef",tk.getCodigoToken());
					logger.info("Fin solicitaresetPassword");
					
				}
				else{
					param =Utiles.CalculaParametro(1);
					msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
					msgRespuesta.put("mensaje", param.getNombreParametroRespuesta());
					logger.info(param.getNombreParametroRespuesta());
				}
			}
			else{
				param =Utiles.CalculaParametro(2);
				msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
				msgRespuesta.put("mensaje", param.getNombreParametroRespuesta());
				logger.info(param.getNombreParametroRespuesta());
			}
		} catch (Exception e) {
			logger.error("Error solicitaresetPassword",e);
			param =Utiles.CalculaParametro(999999);
			msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
			msgRespuesta.put("mensaje",param.getNombreParametroRespuesta()+ e.getMessage());
		}
		return msgRespuesta;
	}

	public HashMap<String, Object> procesarTokenPassword(String token,
			String password) {
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();	
		logger.info("Inicio procesarTokenPassword");
		try {
			msgRespuesta=validarToken(token);
			if(msgRespuesta.get("codigo").toString().equals("0")){
				TokenPasswordUsuario tk =TokenPasswordUsuario.findTokenPasswordUsuario((Long) msgRespuesta.get("token"));
				Usuario user_actual =tk.getUsuarioToken();
				if(user_actual instanceof Usuario){
					
					Calendar cal =Calendar.getInstance();
					OlderPasswords old = new OlderPasswords();
					old.setUsuarioPassword(user_actual);
					old.setOlderpassword(user_actual.getPassword());
					old.setNewPassword(password);
					old.setFechaActu(cal.getTime());
		
					user_actual.setPassword(password);
					tk.setEstadoToken(Habilitacion.DESHABILITADO);
					
					user_actual.merge();
					old.persist();
					
					List<TokenPasswordUsuario> lista =TokenPasswordUsuario.findAllUsuarios(user_actual,Habilitacion.HABILITADO);
					for(int i=0;i<lista.size();i++){
						TokenPasswordUsuario tmp =lista.get(i);
						tmp.setEstadoToken(Habilitacion.DESHABILITADO);
						tmp.merge();
					}
					
					param =Utiles.CalculaParametro(0);
					msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
					msgRespuesta.put("mensaje", param.getNombreParametroRespuesta());
					logger.info("Fin procesarTokenPassword");
				}
				else{
					param =Utiles.CalculaParametro(2);
					msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
					msgRespuesta.put("mensaje", param.getNombreParametroRespuesta());
					logger.info(param.getNombreParametroRespuesta());
				}
			}
			
		} catch (Exception e) {
			logger.error("Error procesarTokenPassword",e);
			param =Utiles.CalculaParametro(999999);
			msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
			msgRespuesta.put("mensaje",param.getNombreParametroRespuesta()+ e.getMessage());
		}
		return msgRespuesta;
	}

	public HashMap<String, Object> validarToken(String token) {
		HashMap<String, Object> msgRespuesta = new HashMap<String, Object>();	
		logger.info("Inicio validarToken");
		try {
			TokenPasswordUsuario tk = null;
			try {
				 tk = TokenPasswordUsuario.findbyToken(token);
			} catch (org.springframework.dao.EmptyResultDataAccessException e) {
				tk=null;
			}
			Calendar cal =Calendar.getInstance();
			if(tk instanceof TokenPasswordUsuario){
				if(tk.getEstadoToken().equals(Habilitacion.HABILITADO)){
					if(tk.getFechaExpiracion().after(cal.getTime()) && tk.getFechaGeneracion().before(cal.getTime())){
						param =Utiles.CalculaParametro(0);
						msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
						msgRespuesta.put("mensaje", param.getNombreParametroRespuesta());
						msgRespuesta.put("token", tk.getId());
						logger.info("Fin validarToken");
					}
					else 
					{
						param =Utiles.CalculaParametro(52);
						msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
						msgRespuesta.put("mensaje", param.getNombreParametroRespuesta());
						logger.info(param.getNombreParametroRespuesta());
					}
				}
				else{
					param =Utiles.CalculaParametro(51);
					msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
					msgRespuesta.put("mensaje", param.getNombreParametroRespuesta());
					logger.info(param.getNombreParametroRespuesta());
				}
			}
			else{
				param =Utiles.CalculaParametro(50);
				msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
				msgRespuesta.put("mensaje", param.getNombreParametroRespuesta());
				logger.info(param.getNombreParametroRespuesta());
			}
			
		} catch (Exception e) {
			logger.error("Error validarToken",e);
			param =Utiles.CalculaParametro(999999);
			msgRespuesta.put("codigo", param.getCodigoParametroRespuesta());
			msgRespuesta.put("mensaje",param.getNombreParametroRespuesta()+ e.getMessage());
		}
		return msgRespuesta;
	}
}
